#ifndef _MB_M_H
#define _MB_M_H

#include "mbconfig.h"   
#include "port.h"    

#ifdef __cplusplus
PR_BEGIN_EXTERN_C  // 兼容C++编译，开始C语言链接域
#endif

#include "mbport.h"   
#include "mbproto.h"  

/* ----------------------- 宏定义 ------------------------------------------*/

#define MB_MASTER_TCP_PORT_USE_DEFAULT 0

#ifndef _MB_H  // 避免与从站头文件mb.h重复定义

/* ----------------------- 枚举类型定义 ---------------------------------*/

typedef enum {
        MB_RTU,   /*!< RTU传输模式 */
        MB_ASCII, /*!< ASCII传输模式 */
        MB_TCP    /*!< TCP模式 */
} eMBMode;

typedef enum {
        MB_REG_READ,  /*!< 读模式：协议栈需获取寄存器当前值，应用层需将值写入缓冲区 */
        MB_REG_WRITE  /*!< 写模式：协议栈需更新寄存器值，应用层需从缓冲区读取新值 */
} eMBRegisterMode;

/*! \ingroup modbus
 * \brief Modbus协议栈通用错误码
 */
typedef enum {
        MB_ENOERR,                  /*!< 无错误 */
        MB_ENOREG,                  /*!< 非法寄存器地址（超出应用层配置范围） */
        MB_EINVAL,                  /*!< 非法参数（如波特率不支持、地址无效） */
        MB_EPORTERR,                /*!< 端口层错误（如串口初始化失败、定时器配置错误） */
        MB_ENORES,                  /*!< 资源不足（如回调函数注册数量超限） */
        MB_EIO,                     /*!< I/O错误（如串口发送失败、接收超时） */
        MB_EILLSTATE,               /*!< 协议栈状态非法（如未初始化就调用使能函数） */
        MB_ETIMEDOUT                /*!< 超时错误（如等待从站响应超时） */
} eMBErrorCode;

#endif  // _MB_H

/*! \ingroup modbus
 * \brief Modbus主机请求专属错误码
 * 仅用于“主机发起请求”类函数（如eMBMasterReqReadCoils()），标识请求的执行结果。
 */
typedef enum {
        MB_MRE_NO_ERR,                  /*!< 请求成功（从站正常响应，无异常） */
        MB_MRE_NO_REG,                  /*!< 非法寄存器地址（从站返回“非法数据地址”异常） */
        MB_MRE_ILL_ARG,                 /*!< 非法请求参数（如从站地址超出配置范围） */
        MB_MRE_REV_DATA,                /*!< 接收数据错误（响应帧校验失败、格式非法） */
        MB_MRE_TIMEDOUT,                /*!< 请求超时（从站未在规定时间内响应） */
        MB_MRE_MASTER_BUSY,             /*!< 主机忙（已有未完成的请求，无法发起新请求） */
        MB_MRE_EXE_FUN                  /*!< 功能码执行错误（从站返回“非法功能码”等异常） */
} eMBMasterReqErrCode;

/*! \ingroup modbus
 * \brief Modbus主机定时器模式（3类核心定时场景）
 * 用于区分定时器的作用，确保协议栈按Modbus规范处理时序（如帧间隔、响应超时）。
 */
typedef enum {
        MB_TMODE_T35,                   /*!< T3.5定时器：接收帧间隔检测（RTU模式3.5字符时间，ASCII模式1秒） */
        MB_TMODE_RESPOND_TIMEOUT,       /*!< 响应超时定时器：等待从站响应的最大时间（用户配置） */
        MB_TMODE_CONVERT_DELAY          /*!< 转换延迟定时器：广播帧发送后，等待从机执行逻辑的延迟 */
} eMBMasterTimerMode;

/* ----------------------- 函数原型声明 ------------------------------*/
/*! \ingroup modbus
 * \brief 初始化Modbus主机协议栈（RTU/ASCII模式）
 *
 * 初始化指定模式（RTU/ASCII）的通信参数，调用端口层接口配置硬件（串口、定时器），
 * 初始化后协议栈处于“未使能”状态，需调用eMBMasterEnable()激活。
 *
 * @param eMode        通信模式（MB_RTU/MB_ASCII）
 * @param ucPort       串口端口号（平台相关，如1对应COM1，部分平台忽略此参数）
 * @param ulBaudRate   波特率（如9600、19200，需端口层支持）
 * @param eParity      校验位（MB_PAR_NONE/MB_PAR_ODD/MB_PAR_EVEN，无校验/奇校验/偶校验）
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，其他为具体错误）
 */
eMBErrorCode    eMBMasterInit(eMBMode eMode, UCHAR ucPort,
        ULONG ulBaudRate, eMBParity eParity);

/*! \ingroup modbus
 * \brief 初始化Modbus主机协议栈（TCP模式）
 *
 * 初始化Modbus TCP模块，配置监听端口，初始化后需调用eMBMasterEnable()激活。
 *
 * @param usTCPPort    TCP监听端口（MB_MASTER_TCP_PORT_USE_DEFAULT=502默认端口）
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_EINVAL=端口无效，MB_EPORTERR=TCP初始化失败）
 */
eMBErrorCode    eMBMasterTCPInit(USHORT usTCPPort);

/*! \ingroup modbus
 * \brief 释放Modbus主机协议栈资源
 *
 * 禁用协议栈，释放端口层资源（如关闭串口、销毁定时器），仅在协议栈“未使能”时调用。
 * 注：需端口层支持（配置MB_PORT_HAS_CLOSE=1）。
 *
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_EILLSTATE=协议栈状态非法）
 */
eMBErrorCode    eMBMasterClose(void);

/*! \ingroup modbus
 * \brief 激活Modbus主机协议栈
 *
 * 使协议栈进入“运行”状态，开始处理通信事件（接收从站响应、触发定时器），
 * 仅在协议栈“已初始化且未使能”时调用。
 *
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_EILLSTATE=状态非法）
 */
eMBErrorCode    eMBMasterEnable(void);

/*! \ingroup modbus
 * \brief 禁用Modbus主机协议栈
 *
 * 使协议栈进入“停止”状态，停止处理通信事件，仅在协议栈“已使能”时调用。
 *
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_EILLSTATE=状态非法）
 */
eMBErrorCode    eMBMasterDisable(void);

/*! \ingroup modbus
 * \brief Modbus主机协议栈主轮询函数
 *
 * 需定期调用（间隔≤从站响应超时时间），处理通信事件（如发送请求帧、解析响应帧、定时器超时），
 * 是协议栈的“核心调度入口”，建议在RTOS任务中单独运行（或主循环中优先调用）。
 *
 * @return eMBErrorCode  错误码（MB_ENOERR=正常，MB_EILLSTATE=协议栈未使能）
 */
eMBErrorCode    eMBMasterPoll(void);

/*! \ingroup modbus
 * \brief 注册Modbus功能码回调函数
 *
 * 为指定功能码（如0x03读保持寄存器）注册自定义处理函数，协议栈接收对应功能码的响应帧时，
 * 会调用该回调函数解析数据。若传入NULL，将删除该功能码的已有回调。
 *
 * @param ucFunctionCode  功能码（1~127，需与从站支持的功能码匹配）
 * @param pxHandler       功能码处理函数（pxMBFunctionHandler类型，返回Modbus异常码）
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_EINVAL=功能码无效，MB_ENORES=资源不足）
 */
eMBErrorCode    eMBMasterRegisterCB(UCHAR ucFunctionCode,
        pxMBFunctionHandler pxHandler);

/* ----------------------- 寄存器回调函数声明 用户自己实现 -------------------------*/
/* ----------------------- 将从机返回的数据保存到指定的缓冲区 -------------------------*/
 /*! \ingroup modbus_master_registers
  * \brief 输入寄存器（Input Register）回调函数（只读）
  * 输入寄存器用于存储模拟量（如温度、电流），协议栈读从站输入寄存器后，调用此回调将数据传入应用层。
  *
  * @param pucRegBuffer  [输入] 协议栈传递的从站响应数据（大端序，16位/寄存器）
  * @param usAddress     [输入] 输入寄存器起始地址（Modbus 1-based，如30001）
  * @param usNRegs       [输入] 需处理的输入寄存器数量
  * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_ENOREG=地址越界）
  */
eMBErrorCode eMBMasterRegInputCB(UCHAR* pucRegBuffer, USHORT usAddress,
        USHORT usNRegs);

/*! \ingroup modbus_master_registers
 * \brief 保持寄存器（Holding Register）回调函数（可读写）
 * 保持寄存器用于存储配置参数（如阈值），读操作时协议栈获取值，写操作时协议栈更新值。
 *
 * @param pucRegBuffer  [输入/输出] 数据缓冲区：写模式=待写数据，读模式=需返回的数据（大端序）
 * @param usAddress     [输入] 保持寄存器起始地址（Modbus 1-based，如40001）
 * @param usNRegs       [输入] 需处理的保持寄存器数量
 * @param eMode         [输入] 操作模式（MB_REG_READ=读，MB_REG_WRITE=写）
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_ENOREG=地址越界）
 */
eMBErrorCode eMBMasterRegHoldingCB(UCHAR* pucRegBuffer, USHORT usAddress,
        USHORT usNRegs, eMBRegisterMode eMode);

/*! \ingroup modbus_master_registers
 * \brief 线圈（Coil）回调函数（可读写）
 * 线圈用于控制开关设备（如继电器），1字节打包8个线圈（bit0~bit7对应8个线圈状态）。
 *
 * @param pucRegBuffer  [输入/输出] 数据缓冲区：写模式=待写bit数据，读模式=需返回的bit数据
 * @param usAddress     [输入] 线圈起始地址（Modbus 1-based，如00001）
 * @param usNCoils      [输入] 需处理的线圈数量
 * @param eMode         [输入] 操作模式（MB_REG_READ=读，MB_REG_WRITE=写）
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_ENOREG=地址越界）
 * @note 建议使用xMBUtilSetBits()/xMBUtilGetBits()处理bit打包
 */
eMBErrorCode eMBMasterRegCoilsCB(UCHAR* pucRegBuffer, USHORT usAddress,
        USHORT usNCoils, eMBRegisterMode eMode);

/*! \ingroup modbus_master_registers
 * \brief 离散输入（Discrete Input）回调函数（只读）
 * 离散输入用于存储开关信号（如按钮状态），1字节打包8个离散输入（bit0~bit7对应状态）。
 *
 * @param pucRegBuffer  [输入] 协议栈传递的从站响应数据（bit打包格式）
 * @param usAddress     [输入] 离散输入起始地址（Modbus 1-based，如10001）
 * @param usNDiscrete   [输入] 需处理的离散输入数量
 * @return eMBErrorCode  错误码（MB_ENOERR=成功，MB_ENOREG=地址越界）
 * @note 建议使用xMBUtilGetBits()解析bit数据
 */
eMBErrorCode eMBMasterRegDiscreteCB(UCHAR* pucRegBuffer, USHORT usAddress,
        USHORT usNDiscrete);

/*---------------------------------- 应用层请求函数（开发者调用，发起Modbus操作） --------------------------------------------------------*/
/**
 * @brief  主机请求：读输入寄存器（功能码0x04）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM，0=广播无效）
 * @param  usRegAddr    输入寄存器起始地址（Modbus 1-based，如30001）
 * @param  usNRegs      读取数量（1~协议栈限制，需≤从站支持数量）
 * @param  lTimeOut     超时时间（ms，-1=永久等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功，其他为错误）
 */
eMBMasterReqErrCode eMBMasterReqReadInputRegister(UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut);

/**
 * @brief  主机请求：写单个保持寄存器（功能码0x06）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM）
 * @param  usRegAddr    保持寄存器地址（Modbus 1-based，如40001）
 * @param  usRegData    待写入数据（16位，大端序）
 * @param  lTimeOut     超时时间（ms，-1=永久等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqWriteHoldingRegister(UCHAR ucSndAddr, USHORT usRegAddr, USHORT usRegData, LONG lTimeOut);

/**
 * @brief  主机请求：批量写多个保持寄存器（功能码0x10）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM，0=广播）
 * @param  usRegAddr    保持寄存器起始地址（Modbus 1-based）
 * @param  usNRegs      写入数量（1~协议栈限制）
 * @param  pusDataBuffer 待写入数据缓冲区（16位数组，大端序）
 * @param  lTimeOut     超时时间（ms，-1=永久等待；广播无需等待，可传0）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqWriteMultipleHoldingRegister(UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, USHORT* pusDataBuffer, LONG lTimeOut);

/**
 * @brief  主机请求：读保持寄存器（功能码0x03）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM）
 * @param  usRegAddr    保持寄存器起始地址（Modbus 1-based，如40001）
 * @param  usNRegs      读取数量（1~协议栈限制）
 * @param  lTimeOut     超时时间（ms，-1=永久等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqReadHoldingRegister(UCHAR ucSndAddr, USHORT usRegAddr, USHORT usNRegs, LONG lTimeOut);

/**
 * @brief  主机请求：读写混合保持寄存器（功能码0x17）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM）
 * @param  usReadRegAddr 读操作起始地址（Modbus 1-based）
 * @param  usNReadRegs  读操作数量
 * @param  pusDataBuffer 写操作数据缓冲区（16位数组，大端序）
 * @param  usWriteRegAddr 写操作起始地址（Modbus 1-based）
 * @param  usNWriteRegs  写操作数量
 * @param  lTimeOut     超时时间（ms，-1=永久等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqReadWriteMultipleHoldingRegister(UCHAR ucSndAddr, USHORT usReadRegAddr, USHORT usNReadRegs, USHORT* pusDataBuffer, USHORT usWriteRegAddr, USHORT usNWriteRegs, LONG lTimeOut);

/**
 * @brief  主机请求：读线圈（功能码0x01）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM）
 * @param  usCoilAddr   线圈起始地址（Modbus 1-based，如00001）
 * @param  usNCoils     读取数量（1~协议栈限制）
 * @param  lTimeOut     超时时间（ms，-1=永久等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqReadCoils(UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils, LONG lTimeOut);

/**
 * @brief  主机请求：写单个线圈（功能码0x05）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM，0=广播）
 * @param  usCoilAddr   线圈地址（Modbus 1-based，如00001）
 * @param  usCoilData   线圈状态（0=关，非0=开）
 * @param  lTimeOut     超时时间（ms，-1=永久等待；广播无需等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqWriteCoil(UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usCoilData, LONG lTimeOut);

/**
 * @brief  主机请求：批量写多个线圈（功能码0x0F）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM，0=广播）
 * @param  usCoilAddr   线圈起始地址（Modbus 1-based）
 * @param  usNCoils     写入数量（1~协议栈限制）
 * @param  pucDataBuffer 待写入数据缓冲区（bit打包格式，1字节=8个线圈）
 * @param  lTimeOut     超时时间（ms，-1=永久等待；广播无需等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqWriteMultipleCoils(UCHAR ucSndAddr, USHORT usCoilAddr, USHORT usNCoils, UCHAR* pucDataBuffer, LONG lTimeOut);

/**
 * @brief  主机请求：读离散输入（功能码0x02）
 * @param  ucSndAddr    从站地址（1~MB_MASTER_TOTAL_SLAVE_NUM）
 * @param  usDiscreteAddr 离散输入起始地址（Modbus 1-based，如10001）
 * @param  usNDiscreteIn 读取数量（1~协议栈限制）
 * @param  lTimeOut     超时时间（ms，-1=永久等待）
 * @return eMBMasterReqErrCode  请求结果（MB_MRE_NO_ERR=成功）
 */
eMBMasterReqErrCode eMBMasterReqReadDiscreteInputs(UCHAR ucSndAddr, USHORT usDiscreteAddr, USHORT usNDiscreteIn, LONG lTimeOut);

/*---------------------------------- 功能码处理函数（协议栈内部用，解析从站响应） --------------------------------------------------------*/

/**
 * @brief  处理“报告从站ID”功能码（0x11）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度（输入=接收长度，输出=处理后长度）
 * @return eMBException  Modbus异常码（MB_EX_NONE=无异常，其他为具体异常）
 */
eMBException eMBMasterFuncReportSlaveID(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“读输入寄存器”功能码（0x04）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncReadInputRegister(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“读保持寄存器”功能码（0x03）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncReadHoldingRegister(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“写单个保持寄存器”功能码（0x06）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncWriteHoldingRegister(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“批量写保持寄存器”功能码（0x10）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncWriteMultipleHoldingRegister(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“读线圈”功能码（0x01）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncReadCoils(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“写单个线圈”功能码（0x05）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncWriteCoil(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“批量写线圈”功能码（0x0F）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncWriteMultipleCoils(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“读离散输入”功能码（0x02）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncReadDiscreteInputs(UCHAR* pucFrame, USHORT* usLen);

/**
 * @brief  处理“读写混合保持寄存器”功能码（0x17）的响应帧
 * @param  pucFrame     从站响应帧缓冲区
 * @param  usLen        [输入/输出] 帧长度
 * @return eMBException  Modbus异常码
 */
eMBException eMBMasterFuncReadWriteMultipleHoldingRegister(UCHAR* pucFrame, USHORT* usLen);

/* ----------------------- Modbus主机外部访问接口（开发者用于自定义扩展） -------------------------*/

// ============================================================================
// 一、PDU发送缓冲区接口（PDU：协议数据单元，Modbus帧的核心数据部分）
// ============================================================================

/**
 * @brief  获取Modbus主机PDU发送缓冲区地址
 * @note   PDU缓冲区存储请求帧的核心数据（功能码、地址、数据，不含帧头/校验），
 *         开发者可直接写入自定义数据（如扩展非标准功能码）。
 * @param  pucFrame [输出] 双重指针，接收PDU缓冲区起始地址（UCHAR*类型）
 * @example
 *         UCHAR *pPDUBuf;
 *         vMBMasterGetPDUSndBuf(&pPDUBuf); // 获取缓冲区地址
 *         pPDUBuf[0] = 0x03; // 写入功能码（读保持寄存器）
 * @return 无
 */
void vMBMasterGetPDUSndBuf(UCHAR** pucFrame);

/**
 * @brief  获取PDU发送缓冲区的有效数据长度
 * @note   有效长度 = PDU帧字节数（不含帧头/校验），用于确认请求数据是否完整。
 * @return USHORT 有效数据长度（单位：字节）
 */
USHORT usMBMasterGetPDUSndLength(void);

/**
 * @brief  设置PDU发送缓冲区的有效数据长度
 * @note   自定义请求帧时，需手动设置有效长度，否则协议栈无法确定发送字节数。
 * @param  SendPDULength [输入] 有效数据长度（需与缓冲区实际数据匹配）
 * @return 无
 */
void vMBMasterSetPDUSndLength(USHORT SendPDULength);

// ============================================================================
// 二、从站地址接口（管理当前通信的目标从站）
// ============================================================================

/**
 * @brief  获取当前请求的目标从站地址
 * @note   用于回调函数中区分从站（如多从站场景，绑定对应从站的缓冲区）。
 * @example
 *         // 多从站线圈缓冲区：ucMCoilBuf[从站索引][数据]
 *         UCHAR *pCoilBuf = ucMCoilBuf[ucMBMasterGetDestAddress() - 1];
 * @return UCHAR 目标从站地址（1~247，0=广播）
 */
UCHAR ucMBMasterGetDestAddress(void);

/**
 * @brief  设置当前请求的目标从站地址
 * @note   发起请求前设置，协议栈会将地址封装到帧头（RTU/ASCII模式）。
 * @param  Address [输入] 目标从站地址（1~247，0=广播）
 * @return 无
 */
void vMBMasterSetDestAddress(UCHAR Address);

// ============================================================================
// 三、定时器模式接口（管理主机通信时序）
// ============================================================================

/**
 * @brief  设置当前定时器的工作模式
 * @note   协议栈内部根据通信阶段自动切换（如接收帧时切T35模式，等待响应时切超时模式），
 *         开发者扩展协议时可能需手动调用。
 * @param  eMBTimerMode [输入] 定时器模式（eMBMasterTimerMode枚举值）
 * @return 无
 */
void vMBMasterSetCurTimerMode(eMBMasterTimerMode eMBTimerMode);

/**
 * @brief  获取当前定时器的工作模式
 * @note   用于调试或状态监控，确认主机当前通信阶段。
 * @return eMBMasterTimerMode 当前定时器模式
 */
eMBMasterTimerMode xMBMasterGetCurTimerMode(void);

// ============================================================================
// 四、请求状态接口（管理请求的类型与完成状态）
// ============================================================================

/**
 * @brief  设置当前请求的类型（广播/单播）
 * @note   广播请求（TRUE）：从站不响应，主机无需等待；
 *         单播请求（FALSE）：从站需响应，主机需调用eMBMasterWaitRequestFinish()等待。
 * @param  xIsBroadcast [输入] 请求类型（TRUE=广播，FALSE=单播）
 * @return 无
 */
void vMBMasterRequestSetType(BOOL xIsBroadcast);

/**
 * @brief  判断当前请求是否为广播类型
 * @note   用于决定是否等待从站响应（广播无需等待）。
 * @return BOOL TRUE=广播请求，FALSE=单播请求
 */
BOOL xMBMasterRequestIsBroadcast(void);

/**
 * @brief  等待当前请求完成（阻塞）
 * @note   单播请求发起后必须调用，等待从站响应或超时，返回请求最终结果。
 * @return eMBMasterReqErrCode 请求结果（MB_MRE_NO_ERR=成功，其他为错误）
 */
eMBMasterReqErrCode eMBMasterWaitRequestFinish(void);

// ============================================================================
// 五、回调模式与错误管理接口（主从共存场景/故障排查）
// ============================================================================

/**
 * @brief  获取当前回调函数的运行模式（主站/从站）
 * @note   主从共存场景（配置MB_MASTER_SLAVE_COEXIST=1）下，区分回调为哪个模式服务，
 *         避免主从站缓冲区混淆。
 * @return BOOL TRUE=主站模式，FALSE=从站模式
 */
BOOL xMBMasterGetCBRunInMasterMode(void);

/**
 * @brief  设置回调函数的运行模式（主站/从站）
 * @note   协议栈内部自动设置，开发者一般无需手动调用。
 * @param  IsMasterMode [输入] 运行模式（TRUE=主站，FALSE=从站）
 * @return 无
 */
void vMBMasterSetCBRunInMasterMode(BOOL IsMasterMode);

/**
 * @brief  获取当前主机的错误类型
 * @note   用于故障排查，定位通信错误原因（如响应超时、校验失败）。
 * @return eMBMasterErrorEventType 错误类型（需结合枚举定义解读）
 */
eMBMasterErrorEventType eMBMasterGetErrorType(void);

/**
 * @brief  设置当前主机的错误类型
 * @note   协议栈内部检测到错误时自动设置，开发者一般无需手动调用。
 * @param  errorType [输入] 错误类型（eMBMasterErrorEventType枚举值）
 * @return 无
 */
void vMBMasterSetErrorType(eMBMasterErrorEventType errorType);

#ifdef __cplusplus
PR_END_EXTERN_C  // 兼容C++编译，结束C语言链接域
#endif

#endif









